package ar.com.logic.components.strategy;

import java.util.Collections;
import java.util.List;
import java.util.Vector;

import ar.com.logic.components.interfaces.IHistoricoRespuestas;
import ar.com.logic.components.interfaces.IMatrizPosiciones;
import ar.com.logic.evaluador.Respuesta;

public class SelectorEstrategia {

	private IMatrizPosiciones matriz;
	private IHistoricoRespuestas historico;
	private IEstrategia ultimaEstrategia;
	private List<Respuesta> resultadosEsperados ;
	private List<IEstrategia> estrategias;

	public SelectorEstrategia(IMatrizPosiciones matriz, IHistoricoRespuestas historico) {

		this.matriz = matriz;
		this.historico = historico;
		this.resultadosEsperados = new Vector<Respuesta>();
		cargarEstrategiasIniciales();
		
	}

	private void cargarEstrategiasIniciales() {
		this.estrategias = new Vector<IEstrategia>();
		this.estrategias.add(new Estrategia3B0C(matriz, historico));
		this.estrategias.add(new EstrategiaCorte(matriz, historico));
		this.estrategias.add(new EstrategiaDescartePosicionUnica(matriz, historico));
		this.estrategias.add(new EstrategiaFuerzaBruta(matriz, historico));
		this.estrategias.add(new EstrategiaInicial(matriz, historico));
		this.estrategias.add(new EstrategiaRandom(matriz, historico));
		
		Collections.sort(this.estrategias, new ComparadorEstrategias());
		
		
	}

	public IEstrategia elegirEstrategia(Respuesta resp) {
		if (resultadosEsperados.size() > 0 && resp != null) {
			for (Respuesta respuesta : resultadosEsperados) {
				if (respuesta.getCorrectos() == resp.getCorrectos()
						&& respuesta.getRegulares() == resp.getRegulares()) {
					this.ultimaEstrategia.actualizarPorRespuestaEsperada(resp);
				}
			}
		}
		for (IEstrategia estrategia : estrategias) {
			if(!estrategia.estaDescartada() && estrategia.esCondicionEsperada(matriz, historico)){
				this.ultimaEstrategia = estrategia;
				break;
			}
		}
		System.out.println(ultimaEstrategia.getNombre());
		this.resultadosEsperados = this.ultimaEstrategia.getRespuestasEsperadas();
		return this.ultimaEstrategia;

	}

}
